<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        1.Promise.all()
            - 会在一组promise全局resolve后返回
            - 接收一个可迭代对象,返回一个新的promise
     */

    // 1.1 简单举例
    let p1 = Promise.all([
        Promise.resolve(1),
        Promise.resolve(2),
    ])
    let p2 = Promise.all([3, 4])
    // 相当于Promise.resolve()
    let p3 = Promise.all([])
    console.log(p1, p2, p3)

    // 1.2 合成的promise只会在每个包含的promise都解决之后才解决
    let p = Promise.all(
        [
            Promise.resolve(2),
            new Promise(resolve => setTimeout(resolve, 1000, 3))
        ]
    )
    setTimeout(console.log, 0, p)
    p.then((value) => {
        console.log('完成', value) // [2,3]
    })

    // 1.3: 如果其中有一个待定promise,则会一直等待
    let p4 = Promise.all([new Promise(() => {
    })])
    p4.then(() => {
        console.log('我想我已经没有机会输出了')
    })

    // 1.4 其中有一个reject会导致最终promise拒绝
    //  返回第一个reject的值
    let p5 = Promise.all(
        [
            Promise.resolve(4),
            Promise.reject(5),
            Promise.reject(6)
        ]
    )
    p5.then((value) => {
        console.log('拒绝的值', value)
    }).catch(err => {
        console.log('捕获到错误呜呜的值', err)
    })

    // 1.5 如果所有的promise都成功,则返回合成的数组
    let p6 = Promise.all(
        [
            Promise.resolve(11),
            Promise.resolve(12),
            Promise.resolve(13)
        ]
    )
    p6.then(_ => {
        console.log('全都完成了', _)
    })


    /*
        2. Promise.race()
            - 返回promise
            - 是一组最先解决或拒绝的
     */

    // 2.1 用法和all()相同,只是返回不同

    // 2.2 解决先发生,超时后的拒绝被忽略
    let p11 = Promise.race(
        [
            Promise.resolve(11),
            new Promise((resolve, reject) => setTimeout(reject, 1000, 12))
        ]
    )
    p11.then((value) => console.log('p11得到的结果', value))  // 11

    // 2.3 拒绝先发现,超时后的解决被忽略
    let p12 = Promise.race(
        [
            Promise.reject(12),
            new Promise((resolve, reject) => setTimeout(resolve, 1000, 13))
        ]
    )
    p12.then((value) => console.log('p12得到的结果', value))  // 12

    // 2.4 迭代顺序决定了落定顺序
    let p13 = Promise.race(
        [
            Promise.resolve(14),
            Promise.resolve(15),
            Promise.resolve(16),
            Promise.resolve(17),
        ]
    )
    p13.then(_ => console.log(_)) // 14

</script>
</body>
</html>